package java19_5_9.com.huweilong.io;

import java.io.*;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

public class CopyDirectory {
    // 当前已经复制了多少文件
    static AtomicInteger count = new AtomicInteger(0);

    static class MyThread extends Thread {
        @Override
        public void run() {
            while (true) {
                int currentCount = count.get(); // 不会有线程安全问题
                System.out.print("\r已经复制了 " + currentCount + " 个文件或目录");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    static class MyTimerTask extends TimerTask {
        @Override
        public void run() {
            int currentCount = count.get(); // 不会有线程安全问题
            System.out.print("\r已经复制了 " + currentCount + " 个文件或目录");
        }
    }

    // 1. static 是为了遍历的时候随时可以使用这两个值
    // 2. 定义 File，一会要使用 File 中的某些方法
    static File srcDir = new File("D:\\课程");
    static File destDir = new File("D:\\2022-05-10\\目标");

    private static File getDestFile(File file) throws IOException {
        String srcPath = srcDir.getCanonicalPath();
        String filePath = file.getCanonicalPath();
        String subPath = filePath.substring(srcPath.length());
        String destPath = destDir.getCanonicalPath();
        String destFilePath = destPath + subPath;

        return new File(destFilePath);
    }

    private static void traversal(File dir) throws IOException {
        // 1. 获取目录下的所有孩子
        File[] files = dir.listFiles();
        if (files == null) {
            return;
        }

        // 2. 遍历目录下的每个孩子（文件）
        for (File file : files) {
            File destFile = getDestFile(file);

            if (file.isDirectory()) {
                // 按照相同的结构，创建出目录  mkdirs()
                destFile.mkdirs();
                count.incrementAndGet();

                traversal(file);
            } else if (file.isFile()) {
                copyFile(file, destFile);
                count.incrementAndGet();
            }
        }
    }

    private static void copyFile(File srcFile, File destFile) throws IOException {
        byte[] b = new byte[1024];
        try (InputStream is = new FileInputStream(srcFile)) {
            try (OutputStream os = new FileOutputStream(destFile)) {
                while (true) {
                    int n = is.read(b);
                    if (n == -1) {
                        break;
                    }

                    os.write(b, 0, n);
                }

                os.flush();
            }
        }
    }

    public static void main(String[] args) throws IOException {
        // 基本条件检查
        if (!srcDir.isDirectory()) {
            System.out.println("源不是目录");
            return;
        }

        if (destDir.exists()) {
            System.out.println("目标目录已经存在");
            return;
        }

//        MyThread t = new MyThread();
//        t.start();
        Timer timer = new Timer();
        MyTimerTask task = new MyTimerTask();
        timer.scheduleAtFixedRate(task, 0, 1000);

        traversal(srcDir);
    }
}
